home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy004 / raton / rata.c
Encoding:
C/C++ Source or Header  |  1997-05-26  |  3.0 KB  |  119 lines

  1. #include <iostream.h>
  2. #include <dos.h>
  3. #include <stdlib.h>
  4.  
  5. int rata[4]; //oh no variables globales, el principal pecado de la prog!!!
  6. //esto es un ejemplo, o sea que a callar.
  7.  
  8. int crida=0;
  9. void ratapresent(); void estatrata(); void desinstala();
  10. void far cont();// función que usaremos como controlador
  11. void veurerata(); void instala();void convermickey(int,int);
  12.  
  13. void ratapresent() // hacemos un reset de la rata
  14. {
  15. unsigned int present;
  16. asm{ // si hay una rata conectada, present será igual a FFFFh
  17. mov ax,00h  // y a bx habrá el número de botones de la rata
  18. int 33h
  19. mov present,ax
  20. }
  21. if(present!=0xffff){cout << "rata no presente" ; exit(1); }
  22. }
  23.  
  24. void veurerata()
  25. {   // hacemos visible el cursor de la rata
  26. asm{
  27. mov ax,0001h
  28. int 33h
  29. } }
  30.  
  31. void noveurerata()
  32. {   // escondemos el cursor
  33. asm{
  34. mov ax,0002h
  35. int 33h
  36. }}
  37.  
  38. void estatrata() // obtenemos posición de la rata y el estado de los botones
  39. {
  40.  // por el método polling.
  41. _AX=0x03;
  42. asm{ int 33h};
  43. rata[0]=_CX;//posición X
  44. rata[1]=_DX; //posición Y
  45. rata[2]=_BX;// en BX está la información de los botones
  46. if(rata[2]==1){ rata[2]=1;rata[3]=0;}//botón izquierdo apretado
  47. if(rata[2]==2) {rata[2]=0;rata[3]=1; }// botón derecho
  48. if(rata[2]==3) {rata[2] =1;rata[3]=1;} // los dos
  49. convermickey(8,8); //pasamos de mickeys a coordenadas de modo texto
  50. }
  51.  
  52. void convermickey(int relx,int rely)
  53. {
  54. rata[0]=rata[0]/relx;
  55. rata[1]=rata[1]/rely;
  56. }
  57.  
  58. void instala()
  59. {
  60. asm {
  61. mov ax,0x0C
  62. mov cx,10 //llamaremos a la función siempre que apretemos 1 de los 2 botones
  63. mov bx,seg cont  //nuestras variables sólo se actualizarán cuando apretemos
  64. mov es,bx //los botones
  65. mov dx, offset cont
  66. int 33h
  67. }
  68. }
  69.  
  70. void desinstala()
  71. {    //para desinstalar el controlador, hacemos como si lo instaláramos,
  72. asm { //pero poniendo en CX,0 es decir nunca llamará al controlador
  73. mov ax,0x0C
  74. mov cx,0
  75. mov bx,seg cont
  76. mov es,bx
  77. mov dx, offset cont
  78. int 33h
  79. }
  80. }
  81.  
  82. void far cont()
  83. {
  84. if(crida) return;//si estamos dentro de la función no aceptamos más llamadas
  85. crida=1;//estamos dentro de la función
  86. _DS=FP_SEG(rata);//ponemos el valor necesario en DS para acceder a
  87. //nuestras variables. (sino DS apunta al segmento del controlador)
  88. rata[0]=_CX;  //como en estatrata
  89. rata[1]=_DX;
  90. rata[2]=_BX;
  91. if(rata[2]==1){rata[2]=1;rata[3]=0;}
  92. if(rata[2]==2){rata[2]=0;rata[3]=1; }
  93. if(rata[2]==3){rata[2] =1;rata[3]=1;}
  94. convermickey(8,8);
  95. crida=0;//aceptamos más llamadas
  96. }
  97.  
  98.  
  99. main()
  100. {
  101. ratapresent();
  102. veurerata();
  103. instala();
  104. while(rata[3]!=1 || rata[2]!=1) // para salir tenemos que apretar los 2
  105. {//botones a la vez.
  106. //estatrata(); para hacerlo por el método de polling solo tendriamos.
  107. // que quitar las funciones instala,desinstala, cont, y poner esta.
  108. cout<<" posx = "<< rata[0]<< " posy = " << rata[1]<< " botó 1 "
  109. <<rata[2] <<" botó 2 " << rata[3] <<endl;
  110. }
  111. desinstala();
  112. noveurerata();
  113. return(0);
  114. }
  115.  
  116. /* Fijaos que yo nunca llamó a la funció cont ,que es la que actualiza los
  117. valores, sino que es el driver del raton quién la llama, una vez la instalo. */
  118.  
  119.